/**
 * Copyright ©2015 上海屹通. All rights reserved.
 *  
 * @Title: LoginHelper.java
 * @Prject: BANK-PSBC-M
 * @Description: 用户登录工具类
 * @Package: cn.com.yitong.app.mbank.system.login.util
 * @author: 何启伟（hqw@yitong.com.cn）
 * @date: 2015年12月7日 上午10:10:55
 * @version: V1.0
 */
package cn.com.yitong.app.mbank.system.login.util;

import cn.com.yitong.component.cache.util.CacheHelper;
import cn.com.yitong.framework.core.util.SessionContextHelper;
import cn.com.yitong.framework.logging.SysLogger;
import cn.com.yitong.framework.support.context.AresContext;
import cn.com.yitong.framework.util.StrHelper;
import cn.com.yitong.framework.util.TypeHelper;

/**
 * @ClassName:
 * @Description: 用户登录工LoginHelper具类
 * @author: 何启伟（hqw@yitong.com.cn）
 * @date: 2015年12月7日 上午10:10:55
 */
public class LoginHelper {
	
	/**
	 * 日志
	 */
	protected static final SysLogger logger = SysLogger.getLogger(LoginHelper.class);
	
	/**
	 * 默认账号属性
	 */
	public static final String ACCT_NO_PROPERTY = "ACCT_NO";
	
	/**
	 * 客户号属性
	 */
	public static final String CUST_NO_PROPERTY = "CUST_NO";

	/**
	 * 登录超时提示信息
	 */
	public static final String LOGIN_TIMEOUT_MESSAGE = "您的登录信息已经超时，请重新登录。";
	
	/**
	 * 自动登出提示信息
	 */
	public static final String LOGIN_LOGOUT_MESSAGE = "您的帐号已经在其他设备登录，如非本人操作，请尽快修改登录密码。";
	
	/**
	 * 返回账号
	 * @param context
	 * @return 账号
	 */
    public static String getAcctNo(AresContext context){
    	if(context == null) {
    		return null;
    	}
    	return TypeHelper.toString(context.getSession(ACCT_NO_PROPERTY));
    }
    
	/**
	 * 设置账号
	 * @param context
	 * @param account
	 */
    public static void setAcctNo(AresContext context, String account){
    	if(context != null) {
    		context.setSession(ACCT_NO_PROPERTY, account);
    	}
    }

	/**
	 * 返回客户号
	 * @param context
	 * @return 客户号
	 */
    public static String getCustNo(AresContext context){
    	if(context == null) {
    		return null;
    	}
    	return TypeHelper.toString(context.getSession(CUST_NO_PROPERTY));
    }
    
	/**
	 * 设置客户号
	 * @param context
	 * @param custNo
	 */
    public static void setCustNo(AresContext context, String custNo){
    	//以客户号为key，将sessionid缓存，用于单点登录判断
    	if(context != null){
    		context.setSession(CUST_NO_PROPERTY, custNo);
	    	try {
				CacheHelper.putCache(custNo, context.getId());
	    		logger.error("以客户号[{0}]为key，缓存会话ID[{1}]", custNo, context.getId());
			} 
	    	catch (Exception e) {
	    		logger.error("以客户号[{0}]为key，缓存会话ID失败，默认允许同一账号多处登录", custNo, e);
			}
    	}
    }

	/**
	 * 是否登录超时
	 * @param context
	 * @return boolean
	 */
    public static boolean isTimeout(AresContext context){
		return StrHelper.isEmpty(LoginHelper.getCustNo(context));
    }
    
	/**
	 * 判断是否同一账号多处登录
	 * @param context
	 * @return boolean
	 */
	public static boolean isMultipleLogin(AresContext context){
		boolean isMultiple = true;
    	if(context != null){
    		String custNo = TypeHelper.toString(context.getSession(CUST_NO_PROPERTY));
    		Object cacheSessionId = CacheHelper.getCache(custNo);
    		if(cacheSessionId == null){
    	    	try {
    				CacheHelper.putCache(custNo, context.getId());
    	    		logger.error("以客户号[{0}]为key，缓存会话ID[{1}]", custNo, context.getId());
    			} 
    	    	catch (Exception e) {
    	    		logger.error("以客户号[{0}]为key，缓存会话ID失败，默认允许同一账号多处登录", custNo, e);
    			}
    		}
    		isMultiple = custNo != null && !context.getId().equals(cacheSessionId);
    	}
		return isMultiple;
	}
    
    /**
     * 清除session
     * @param context
     */
    public static void clearSession(AresContext context) {
    	if(context != null){
    		String custNo = LoginHelper.getCustNo(context);
    		if(!StrHelper.isEmpty(custNo)){
    			SessionContextHelper.invalidateSession(context.getId());
    		}
    	}
    }

}
